library(ggpubr)
Loading required package: magrittr

Attaching package: ‘magrittr’

The following object is masked from ‘package:purrr’:

    set_names

The following object is masked from ‘package:tidyr’:

    extract


Attaching package: ‘ggpubr’

The following object is masked from ‘package:cowplot’:

    get_legend
f74.rna.seu@meta.data <- f74.rna.seu@meta.data %>%
  rownames_to_column("cell") %>%
  left_join(annotation.df) %>%
  column_to_rownames("cell")
Joining, by = "cell"

First I have made the snap file from the cellranger fragments.tsv file. Script is multiOmic_benchmark/preprocess/fragments2snap.sh.

Following integration vignette

Barcode selection

Filtering based on number of reads per cell and ratio of fragments that are within promoters

barcode.ls = lapply(seq(snap.files), function(i){
  barcodes = barcode.ls[[i]];
  idx = which(
      barcodes$logUMI >= cutoff.logUMI.low[i] & 
      barcodes$logUMI <= cutoff.logUMI.high[i] & 
      barcodes$promoter_ratio >= cutoff.FRIP.low[i] &
      barcodes$promoter_ratio <= cutoff.FRIP.high[i]
  );
  barcodes[idx,]
});
x.sp.ls = lapply(seq(snap.files), function(i){
  barcodes = barcode.ls[[i]];
  x.sp = x.sp.ls[[i]];
  barcode.shared = intersect(x.sp@barcode, barcodes$barcode);
  x.sp = x.sp[match(barcode.shared, x.sp@barcode),];
  barcodes = barcodes[match(barcode.shared, barcodes$barcode),];
  x.sp@metaData = barcodes;
  x.sp
})
names(x.sp.ls) = sample.names;
x.sp = Reduce(snapRbind, x.sp.ls);
x.sp@metaData["sample"] = x.sp@sample;
x.sp
number of barcodes: 6043
number of bins: 0
number of genes: 0
number of peaks: 0
number of motifs: 0

Add cell-by-bin matrix

x.sp = addBmatToSnap(x.sp, bin.size = 5000)
Epoch: reading cell-bin count matrix session ...

Binarize matrix

Some items in the count matrix have abnormally high coverage perhaps due to the alignment errors. Therefore, we next remove top 0.1% items in the count matrix and then convert the remaining non-zero values to 1.

x.sp = makeBinary(x.sp, mat="bmat")
x.sp
number of barcodes: 6043
number of bins: 651791
number of genes: 0
number of peaks: 0
number of motifs: 0

Filter bins

Filter out bins overlapping w ENCODE blacklist

black_list = read.table("~/annotations/hg38.blacklist.bed.gz")
black_list.gr = GRanges(
  black_list[,1], 
  IRanges(black_list[,2], black_list[,3])
);
idy = queryHits(
  findOverlaps(x.sp@feature, black_list.gr)
);
if(length(idy) > 0){
  x.sp = x.sp[,-idy, mat="bmat"];
};
x.sp
number of barcodes: 6043
number of bins: 651765
number of genes: 0
number of peaks: 0
number of motifs: 0

Exclude bad chromosomes

chr.exclude = seqlevels(x.sp@feature)[grep("random|chrM", seqlevels(x.sp@feature))]
idy = grep(paste(chr.exclude, collapse="|"), x.sp@feature)
if(length(idy) > 0){
  x.sp = x.sp[,-idy, mat="bmat"]
}
x.sp
number of barcodes: 6043
number of bins: 650342
number of genes: 0
number of peaks: 0
number of motifs: 0

remove the top 5% bins that overlap with invariant features such as the house keeping gene promoters

bin.cov = log10(Matrix::colSums(x.sp@bmat)+1)
# bin.cov = Matrix::colSums(x.sp@bmat)
hist(
  bin.cov[bin.cov > 0], 
  xlab="log10(bin cov)", 
  main="log10(Bin Cov)", 
  col="lightblue", 
  # xlim=c(0, 5),
  breaks=100
);

bin.cutoff = quantile(bin.cov[bin.cov > 0], 0.95)
idy = which(bin.cov <= bin.cutoff & bin.cov > 0)
x.sp = x.sp[, idy, mat="bmat"];
x.sp
number of barcodes: 6043
number of bins: 539584
number of genes: 0
number of peaks: 0
number of motifs: 0

Remove any cells of bin coverage less than 1,000. The rational behind this is that some cells may have high number of unique fragments but end up with low bin coverage after filtering. This step is optional but highly recommanded.

idx = which(Matrix::rowSums(x.sp@bmat) > 1000);
x.sp = x.sp[idx,];
x.sp
number of barcodes: 5793
number of bins: 539584
number of genes: 0
number of peaks: 0
number of motifs: 0

Dimensionality reduction

Uses diffusion map algorithm w sampling technique to make it fast.

## Sample 100 cells as landmarks 
row.covs.dens <- density(
  x = x.sp@metaData[,"logUMI"], 
  bw = 'nrd', adjust = 1
)
sampling_prob <- 1 / (approx(x = row.covs.dens$x, y = row.covs.dens$y, xout = x.sp@metaData[,"logUMI"])$y + .Machine$double.eps);
set.seed(1)
idx.landmark.ds <- sort(sample(x = seq(nrow(x.sp)), size = 1000, prob = sampling_prob))
## Split between landmark and query cells
x.landmark.sp = x.sp[idx.landmark.ds,];
x.query.sp = x.sp[-idx.landmark.ds,];
## Run diffusion map on landmark
x.landmark.sp = runDiffusionMaps(
  obj= x.landmark.sp,
  input.mat="bmat", 
  num.eigs=50
);
Epoch: checking the inputs ...
Epoch: computing jaccard similarity matrix ...
Epoch: fitting regression model ...
Epoch: performing normalization ...
Epoch: computing eigen decomposition ...
Epoch: Done
x.landmark.sp@metaData$landmark = 1;
## Project query cells
x.query.sp = runDiffusionMapsExtension(
  obj1=x.landmark.sp, 
  obj2=x.query.sp,
  input.mat="bmat"
)
Epoch: checking the inputs ...
Epoch: computing jaccard similarity matrix ...
Epoch: performing normalization ...
Epoch: projecting query cells to the reference ...
Epoch: Done
x.query.sp@metaData$landmark = 0;
## Combine 
x.sp = snapRbind(x.landmark.sp, x.query.sp);
'rBind' is deprecated.
 Since R version 3.2.0, base's rbind() should work fine with S4 objects
x.sp = x.sp[order(x.sp@metaData[,"sample"])]; #IMPORTANT

To determine significant diffusion components: > We use an ad hoc method by simply looking at a pairwise plot and select the number of eigen vectors that the scatter plot starts looking like a blob. In the below example, we choose the first 15 eigen vectors.

plotDimReductPW(
    obj=x.sp, 
    eigs.dims=1:50,
    point.size=0.3,
    point.color="grey",
    point.shape=19,
    point.alpha=0.6,
    down.sample=5000,
    pdf.file.name=NULL, 
    pdf.height=7, 
    pdf.width=7
  );

Clustering and visualization

x.sp=runCluster(
    obj=x.sp,
    tmp.folder=tempdir(),
    louvain.lib="leiden",
    seed.use=10,
    resolution=0.7
  );
Epoch: checking input parameters
Epoch: finding clusters using leiden

Visualization

Make gene matrix

x.sp <- readRDS( "~/my_data/cellranger-atac110_count_30439_WSSS8038360_GRCh38-1_1_0.snapATAC.RDS")
Loading required package: SnapATAC
Loading required package: rhdf5

Attaching package: ‘SnapATAC’

The following object is masked from ‘package:liger’:

    plotGene

Repeat visualization on gmat

FeaturePlot(f74.seu, features = c('PTPRC','CD4','CD8A','CD8B','CD79A','FOXN1','EPCAM','PDGFRA','GNG4', 'FOXP3','RAG1','RAG2','NKG7','CCR7'), reduction = "umap.snap")
All cells have the same value (0) of CD79A.All cells have the same value (0) of RAG2.All cells have the same value (0) of NKG7.All cells have the same value (0) of CCR7.
DimHeatmap(f74.seu, dims = 1:6, balanced = TRUE,ncol = 1)

31 Oct 2019 09:28:40 [rsession-] CLIENT EXCEPTION (rsession-jovyan): (TypeError) : Cannot read property 'a' of null;
org/rstudio/studio/client/workbench/views/source/editors/text/ChunkPlotPage.java#52::execute
org/rstudio/studio/client/workbench/views/source/editors/text/ChunkPlotWidget.java#49::onBrowserEvent
com/google/gwt/user/client/DOM.java#1414::dispatchEvent
com/google/gwt/user/client/impl/DOMImplStandard.java#312::dispatchEvent
com/google/gwt/user/client/impl/DOMImplStandard.java#334::dispatchUnhandledEvent
com/google/gwt/core/client/impl/Impl.java#244::apply
com/google/gwt/core/client/impl/Impl.java#283::entry0
rstudio-0.js#-1::eval
Client-ID: 7beb3877-891d-4e16-98d5-f8cca1f72d5d
User-Agent: Mozilla/5.0 (Macintosh  Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36

Differential analysis

DAGs_cl <- FindAllMarkers(f74.seu, min.pct = 0.2, logfc.threshold = 0.3)
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |++++                                              | 7 % ~02s          
  |+++++++                                           | 13% ~02s          
  |++++++++++                                        | 20% ~02s          
  |++++++++++++++                                    | 27% ~01s          
  |+++++++++++++++++                                 | 33% ~01s          
  |++++++++++++++++++++                              | 40% ~01s          
  |++++++++++++++++++++++++                          | 47% ~01s          
  |+++++++++++++++++++++++++++                       | 53% ~01s          
  |++++++++++++++++++++++++++++++                    | 60% ~01s          
  |++++++++++++++++++++++++++++++++++                | 67% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s  
Calculating cluster 2

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~36s          
  |++                                                | 2 % ~33s          
  |++                                                | 4 % ~31s          
  |+++                                               | 5 % ~30s          
  |+++                                               | 6 % ~30s          
  |++++                                              | 7 % ~29s          
  |+++++                                             | 8 % ~29s          
  |+++++                                             | 9 % ~28s          
  |++++++                                            | 11% ~28s          
  |++++++                                            | 12% ~27s          
  |+++++++                                           | 13% ~27s          
  |++++++++                                          | 14% ~26s          
  |++++++++                                          | 15% ~26s          
  |+++++++++                                         | 16% ~25s          
  |+++++++++                                         | 18% ~25s          
  |++++++++++                                        | 19% ~24s          
  |++++++++++                                        | 20% ~24s          
  |+++++++++++                                       | 21% ~24s          
  |++++++++++++                                      | 22% ~23s          
  |++++++++++++                                      | 24% ~23s          
  |+++++++++++++                                     | 25% ~22s          
  |+++++++++++++                                     | 26% ~22s          
  |++++++++++++++                                    | 27% ~22s          
  |+++++++++++++++                                   | 28% ~21s          
  |+++++++++++++++                                   | 29% ~21s          
  |++++++++++++++++                                  | 31% ~20s          
  |++++++++++++++++                                  | 32% ~20s          
  |+++++++++++++++++                                 | 33% ~20s          
  |++++++++++++++++++                                | 34% ~19s          
  |++++++++++++++++++                                | 35% ~19s          
  |+++++++++++++++++++                               | 36% ~19s          
  |+++++++++++++++++++                               | 38% ~18s          
  |++++++++++++++++++++                              | 39% ~18s          
  |++++++++++++++++++++                              | 40% ~17s          
  |+++++++++++++++++++++                             | 41% ~17s          
  |++++++++++++++++++++++                            | 42% ~17s          
  |++++++++++++++++++++++                            | 44% ~16s          
  |+++++++++++++++++++++++                           | 45% ~16s          
  |+++++++++++++++++++++++                           | 46% ~16s          
  |++++++++++++++++++++++++                          | 47% ~15s          
  |+++++++++++++++++++++++++                         | 48% ~15s          
  |+++++++++++++++++++++++++                         | 49% ~15s          
  |++++++++++++++++++++++++++                        | 51% ~14s          
  |++++++++++++++++++++++++++                        | 52% ~14s          
  |+++++++++++++++++++++++++++                       | 53% ~14s          
  |++++++++++++++++++++++++++++                      | 54% ~13s          
  |++++++++++++++++++++++++++++                      | 55% ~13s          
  |+++++++++++++++++++++++++++++                     | 56% ~12s          
  |+++++++++++++++++++++++++++++                     | 58% ~12s          
  |++++++++++++++++++++++++++++++                    | 59% ~12s          
  |++++++++++++++++++++++++++++++                    | 60% ~11s          
  |+++++++++++++++++++++++++++++++                   | 61% ~11s          
  |++++++++++++++++++++++++++++++++                  | 62% ~11s          
  |++++++++++++++++++++++++++++++++                  | 64% ~12s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~11s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~11s          
  |++++++++++++++++++++++++++++++++++                | 67% ~10s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~10s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~09s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~09s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~09s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=27s  
Calculating cluster 3

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~24s          
  |++                                                | 2 % ~24s          
  |++                                                | 3 % ~24s          
  |+++                                               | 4 % ~24s          
  |+++                                               | 6 % ~23s          
  |++++                                              | 7 % ~23s          
  |++++                                              | 8 % ~23s          
  |+++++                                             | 9 % ~22s          
  |+++++                                             | 10% ~22s          
  |++++++                                            | 11% ~22s          
  |+++++++                                           | 12% ~22s          
  |+++++++                                           | 13% ~21s          
  |++++++++                                          | 14% ~21s          
  |++++++++                                          | 16% ~21s          
  |+++++++++                                         | 17% ~21s          
  |+++++++++                                         | 18% ~20s          
  |++++++++++                                        | 19% ~20s          
  |++++++++++                                        | 20% ~20s          
  |+++++++++++                                       | 21% ~20s          
  |++++++++++++                                      | 22% ~19s          
  |++++++++++++                                      | 23% ~19s          
  |+++++++++++++                                     | 24% ~19s          
  |+++++++++++++                                     | 26% ~19s          
  |++++++++++++++                                    | 27% ~18s          
  |++++++++++++++                                    | 28% ~18s          
  |+++++++++++++++                                   | 29% ~18s          
  |+++++++++++++++                                   | 30% ~18s          
  |++++++++++++++++                                  | 31% ~17s          
  |+++++++++++++++++                                 | 32% ~17s          
  |+++++++++++++++++                                 | 33% ~17s          
  |++++++++++++++++++                                | 34% ~17s          
  |++++++++++++++++++                                | 36% ~16s          
  |+++++++++++++++++++                               | 37% ~16s          
  |+++++++++++++++++++                               | 38% ~16s          
  |++++++++++++++++++++                              | 39% ~15s          
  |++++++++++++++++++++                              | 40% ~15s          
  |+++++++++++++++++++++                             | 41% ~15s          
  |++++++++++++++++++++++                            | 42% ~15s          
  |++++++++++++++++++++++                            | 43% ~14s          
  |+++++++++++++++++++++++                           | 44% ~14s          
  |+++++++++++++++++++++++                           | 46% ~14s          
  |++++++++++++++++++++++++                          | 47% ~13s          
  |++++++++++++++++++++++++                          | 48% ~13s          
  |+++++++++++++++++++++++++                         | 49% ~13s          
  |+++++++++++++++++++++++++                         | 50% ~13s          
  |++++++++++++++++++++++++++                        | 51% ~12s          
  |+++++++++++++++++++++++++++                       | 52% ~12s          
  |+++++++++++++++++++++++++++                       | 53% ~12s          
  |++++++++++++++++++++++++++++                      | 54% ~11s          
  |++++++++++++++++++++++++++++                      | 56% ~11s          
  |+++++++++++++++++++++++++++++                     | 57% ~11s          
  |+++++++++++++++++++++++++++++                     | 58% ~11s          
  |++++++++++++++++++++++++++++++                    | 59% ~10s          
  |++++++++++++++++++++++++++++++                    | 60% ~10s          
  |+++++++++++++++++++++++++++++++                   | 61% ~10s          
  |++++++++++++++++++++++++++++++++                  | 62% ~10s          
  |++++++++++++++++++++++++++++++++                  | 63% ~09s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~09s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~10s          
  |++++++++++++++++++++++++++++++++++                | 67% ~09s          
  |++++++++++++++++++++++++++++++++++                | 68% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~09s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~08s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~08s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~07s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~06s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=27s  
Calculating cluster 4

  |                                                  | 0 % ~calculating  
  |+                                                 | 2 % ~02s          
  |++                                                | 4 % ~02s          
  |+++                                               | 5 % ~02s          
  |++++                                              | 7 % ~02s          
  |+++++                                             | 9 % ~02s          
  |++++++                                            | 11% ~02s          
  |+++++++                                           | 12% ~02s          
  |++++++++                                          | 14% ~02s          
  |+++++++++                                         | 16% ~02s          
  |+++++++++                                         | 18% ~02s          
  |++++++++++                                        | 20% ~02s          
  |+++++++++++                                       | 21% ~02s          
  |++++++++++++                                      | 23% ~02s          
  |+++++++++++++                                     | 25% ~02s          
  |++++++++++++++                                    | 27% ~02s          
  |+++++++++++++++                                   | 29% ~02s          
  |++++++++++++++++                                  | 30% ~02s          
  |+++++++++++++++++                                 | 32% ~02s          
  |+++++++++++++++++                                 | 34% ~02s          
  |++++++++++++++++++                                | 36% ~02s          
  |+++++++++++++++++++                               | 38% ~02s          
  |++++++++++++++++++++                              | 39% ~02s          
  |+++++++++++++++++++++                             | 41% ~02s          
  |++++++++++++++++++++++                            | 43% ~01s          
  |+++++++++++++++++++++++                           | 45% ~01s          
  |++++++++++++++++++++++++                          | 46% ~01s          
  |+++++++++++++++++++++++++                         | 48% ~01s          
  |+++++++++++++++++++++++++                         | 50% ~01s          
  |++++++++++++++++++++++++++                        | 52% ~01s          
  |+++++++++++++++++++++++++++                       | 54% ~01s          
  |++++++++++++++++++++++++++++                      | 55% ~01s          
  |+++++++++++++++++++++++++++++                     | 57% ~01s          
  |++++++++++++++++++++++++++++++                    | 59% ~01s          
  |+++++++++++++++++++++++++++++++                   | 61% ~01s          
  |++++++++++++++++++++++++++++++++                  | 62% ~01s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~01s          
  |++++++++++++++++++++++++++++++++++                | 66% ~01s          
  |++++++++++++++++++++++++++++++++++                | 68% ~01s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~01s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~01s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~01s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~01s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~01s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=03s  
Calculating cluster 5

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~07s          
  |++                                                | 3 % ~07s          
  |++                                                | 4 % ~07s          
  |+++                                               | 5 % ~07s          
  |++++                                              | 7 % ~07s          
  |++++                                              | 8 % ~07s          
  |+++++                                             | 9 % ~06s          
  |++++++                                            | 11% ~06s          
  |++++++                                            | 12% ~06s          
  |+++++++                                           | 13% ~06s          
  |++++++++                                          | 14% ~06s          
  |++++++++                                          | 16% ~06s          
  |+++++++++                                         | 17% ~06s          
  |++++++++++                                        | 18% ~06s          
  |++++++++++                                        | 20% ~06s          
  |+++++++++++                                       | 21% ~06s          
  |++++++++++++                                      | 22% ~06s          
  |++++++++++++                                      | 24% ~06s          
  |+++++++++++++                                     | 25% ~05s          
  |++++++++++++++                                    | 26% ~05s          
  |++++++++++++++                                    | 28% ~05s          
  |+++++++++++++++                                   | 29% ~05s          
  |++++++++++++++++                                  | 30% ~05s          
  |++++++++++++++++                                  | 32% ~05s          
  |+++++++++++++++++                                 | 33% ~05s          
  |++++++++++++++++++                                | 34% ~05s          
  |++++++++++++++++++                                | 36% ~05s          
  |+++++++++++++++++++                               | 37% ~05s          
  |++++++++++++++++++++                              | 38% ~05s          
  |++++++++++++++++++++                              | 39% ~04s          
  |+++++++++++++++++++++                             | 41% ~04s          
  |++++++++++++++++++++++                            | 42% ~04s          
  |++++++++++++++++++++++                            | 43% ~04s          
  |+++++++++++++++++++++++                           | 45% ~04s          
  |++++++++++++++++++++++++                          | 46% ~04s          
  |++++++++++++++++++++++++                          | 47% ~04s          
  |+++++++++++++++++++++++++                         | 49% ~04s          
  |+++++++++++++++++++++++++                         | 50% ~04s          
  |++++++++++++++++++++++++++                        | 51% ~04s          
  |+++++++++++++++++++++++++++                       | 53% ~04s          
  |+++++++++++++++++++++++++++                       | 54% ~03s          
  |++++++++++++++++++++++++++++                      | 55% ~03s          
  |+++++++++++++++++++++++++++++                     | 57% ~03s          
  |+++++++++++++++++++++++++++++                     | 58% ~03s          
  |++++++++++++++++++++++++++++++                    | 59% ~03s          
  |+++++++++++++++++++++++++++++++                   | 61% ~03s          
  |+++++++++++++++++++++++++++++++                   | 62% ~03s          
  |++++++++++++++++++++++++++++++++                  | 63% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~03s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~03s          
  |++++++++++++++++++++++++++++++++++                | 67% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~02s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~02s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~02s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~02s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~02s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~02s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=07s  
Calculating cluster 6

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~13s          
  |++                                                | 2 % ~14s          
  |++                                                | 3 % ~14s          
  |+++                                               | 4 % ~13s          
  |+++                                               | 5 % ~13s          
  |++++                                              | 6 % ~13s          
  |++++                                              | 7 % ~13s          
  |+++++                                             | 9 % ~13s          
  |+++++                                             | 10% ~13s          
  |++++++                                            | 11% ~12s          
  |++++++                                            | 12% ~12s          
  |+++++++                                           | 13% ~12s          
  |+++++++                                           | 14% ~12s          
  |++++++++                                          | 15% ~12s          
  |++++++++                                          | 16% ~12s          
  |+++++++++                                         | 17% ~11s          
  |++++++++++                                        | 18% ~11s          
  |++++++++++                                        | 19% ~11s          
  |+++++++++++                                       | 20% ~11s          
  |+++++++++++                                       | 21% ~11s          
  |++++++++++++                                      | 22% ~11s          
  |++++++++++++                                      | 23% ~11s          
  |+++++++++++++                                     | 24% ~10s          
  |+++++++++++++                                     | 26% ~10s          
  |++++++++++++++                                    | 27% ~10s          
  |++++++++++++++                                    | 28% ~10s          
  |+++++++++++++++                                   | 29% ~10s          
  |+++++++++++++++                                   | 30% ~10s          
  |++++++++++++++++                                  | 31% ~09s          
  |++++++++++++++++                                  | 32% ~09s          
  |+++++++++++++++++                                 | 33% ~09s          
  |++++++++++++++++++                                | 34% ~09s          
  |++++++++++++++++++                                | 35% ~09s          
  |+++++++++++++++++++                               | 36% ~09s          
  |+++++++++++++++++++                               | 37% ~09s          
  |++++++++++++++++++++                              | 38% ~08s          
  |++++++++++++++++++++                              | 39% ~08s          
  |+++++++++++++++++++++                             | 40% ~08s          
  |+++++++++++++++++++++                             | 41% ~08s          
  |++++++++++++++++++++++                            | 43% ~08s          
  |++++++++++++++++++++++                            | 44% ~08s          
  |+++++++++++++++++++++++                           | 45% ~08s          
  |+++++++++++++++++++++++                           | 46% ~07s          
  |++++++++++++++++++++++++                          | 47% ~07s          
  |++++++++++++++++++++++++                          | 48% ~07s          
  |+++++++++++++++++++++++++                         | 49% ~07s          
  |+++++++++++++++++++++++++                         | 50% ~07s          
  |++++++++++++++++++++++++++                        | 51% ~07s          
  |+++++++++++++++++++++++++++                       | 52% ~07s          
  |+++++++++++++++++++++++++++                       | 53% ~06s          
  |++++++++++++++++++++++++++++                      | 54% ~06s          
  |++++++++++++++++++++++++++++                      | 55% ~06s          
  |+++++++++++++++++++++++++++++                     | 56% ~06s          
  |+++++++++++++++++++++++++++++                     | 57% ~06s          
  |++++++++++++++++++++++++++++++                    | 59% ~06s          
  |++++++++++++++++++++++++++++++                    | 60% ~05s          
  |+++++++++++++++++++++++++++++++                   | 61% ~05s          
  |+++++++++++++++++++++++++++++++                   | 62% ~05s          
  |++++++++++++++++++++++++++++++++                  | 63% ~05s          
  |++++++++++++++++++++++++++++++++                  | 64% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~05s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~05s          
  |++++++++++++++++++++++++++++++++++                | 67% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~04s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~04s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~04s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~04s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~03s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~03s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~03s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=13s  
Calculating cluster 7

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02m 24s      
  |++                                                | 2 % ~02m 23s      
  |++                                                | 3 % ~02m 20s      
  |+++                                               | 4 % ~02m 18s      
  |+++                                               | 5 % ~02m 15s      
  |++++                                              | 6 % ~02m 12s      
  |++++                                              | 7 % ~02m 29s      
  |+++++                                             | 8 % ~02m 24s      
  |+++++                                             | 9 % ~02m 20s      
  |++++++                                            | 10% ~02m 17s      
  |++++++                                            | 11% ~02m 14s      
  |+++++++                                           | 12% ~02m 11s      
  |+++++++                                           | 13% ~02m 09s      
  |++++++++                                          | 14% ~02m 06s      
  |++++++++                                          | 15% ~02m 04s      
  |+++++++++                                         | 16% ~02m 02s      
  |+++++++++                                         | 17% ~01m 60s      
  |++++++++++                                        | 18% ~01m 58s      
  |++++++++++                                        | 19% ~01m 56s      
  |+++++++++++                                       | 20% ~01m 54s      
  |+++++++++++                                       | 21% ~01m 53s      
  |++++++++++++                                      | 22% ~01m 51s      
  |++++++++++++                                      | 23% ~01m 49s      
  |+++++++++++++                                     | 24% ~01m 47s      
  |+++++++++++++                                     | 25% ~01m 45s      
  |++++++++++++++                                    | 26% ~01m 43s      
  |++++++++++++++                                    | 27% ~01m 42s      
  |+++++++++++++++                                   | 28% ~01m 40s      
  |+++++++++++++++                                   | 29% ~01m 39s      
  |++++++++++++++++                                  | 30% ~01m 37s      
  |++++++++++++++++                                  | 31% ~01m 35s      
  |+++++++++++++++++                                 | 32% ~01m 34s      
  |+++++++++++++++++                                 | 33% ~01m 32s      
  |++++++++++++++++++                                | 34% ~01m 31s      
  |++++++++++++++++++                                | 35% ~01m 29s      
  |+++++++++++++++++++                               | 36% ~01m 31s      
  |+++++++++++++++++++                               | 37% ~01m 29s      
  |++++++++++++++++++++                              | 38% ~01m 28s      
  |++++++++++++++++++++                              | 39% ~01m 26s      
  |+++++++++++++++++++++                             | 40% ~01m 25s      
  |+++++++++++++++++++++                             | 41% ~01m 23s      
  |++++++++++++++++++++++                            | 42% ~01m 22s      
  |++++++++++++++++++++++                            | 43% ~01m 20s      
  |+++++++++++++++++++++++                           | 44% ~01m 19s      
  |+++++++++++++++++++++++                           | 45% ~01m 17s      
  |++++++++++++++++++++++++                          | 46% ~01m 15s      
  |++++++++++++++++++++++++                          | 47% ~01m 14s      
  |+++++++++++++++++++++++++                         | 48% ~01m 12s      
  |+++++++++++++++++++++++++                         | 49% ~01m 11s      
  |++++++++++++++++++++++++++                        | 51% ~01m 09s      
  |++++++++++++++++++++++++++                        | 52% ~01m 08s      
  |+++++++++++++++++++++++++++                       | 53% ~01m 06s      
  |+++++++++++++++++++++++++++                       | 54% ~01m 05s      
  |++++++++++++++++++++++++++++                      | 55% ~01m 03s      
  |++++++++++++++++++++++++++++                      | 56% ~01m 02s      
  |+++++++++++++++++++++++++++++                     | 57% ~01m 00s      
  |+++++++++++++++++++++++++++++                     | 58% ~59s          
  |++++++++++++++++++++++++++++++                    | 59% ~01m 04s      
  |++++++++++++++++++++++++++++++                    | 60% ~01m 03s      
  |+++++++++++++++++++++++++++++++                   | 61% ~01m 01s      
  |+++++++++++++++++++++++++++++++                   | 62% ~59s          
  |++++++++++++++++++++++++++++++++                  | 63% ~57s          
  |++++++++++++++++++++++++++++++++                  | 64% ~56s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~54s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~52s          
  |++++++++++++++++++++++++++++++++++                | 67% ~51s          
  |++++++++++++++++++++++++++++++++++                | 68% ~49s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~47s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~46s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~44s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~42s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~41s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~39s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~38s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~36s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~34s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~33s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~31s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~30s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~28s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~27s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~25s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~24s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~22s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~21s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~19s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~18s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~15s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02m 22s
Calculating cluster 8

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 34s      
  |++                                                | 2 % ~01m 32s      
  |++                                                | 3 % ~01m 34s      
  |+++                                               | 4 % ~01m 32s      
  |+++                                               | 5 % ~01m 59s      
  |++++                                              | 6 % ~01m 53s      
  |++++                                              | 7 % ~01m 48s      
  |+++++                                             | 8 % ~01m 45s      
  |+++++                                             | 9 % ~01m 41s      
  |++++++                                            | 10% ~01m 38s      
  |++++++                                            | 11% ~01m 36s      
  |+++++++                                           | 12% ~01m 34s      
  |+++++++                                           | 13% ~01m 32s      
  |++++++++                                          | 14% ~01m 30s      
  |++++++++                                          | 15% ~01m 28s      
  |+++++++++                                         | 16% ~01m 27s      
  |+++++++++                                         | 17% ~01m 25s      
  |++++++++++                                        | 18% ~01m 24s      
  |++++++++++                                        | 19% ~01m 23s      
  |+++++++++++                                       | 20% ~01m 21s      
  |+++++++++++                                       | 21% ~01m 20s      
  |++++++++++++                                      | 22% ~01m 19s      
  |++++++++++++                                      | 23% ~01m 17s      
  |+++++++++++++                                     | 24% ~01m 16s      
  |+++++++++++++                                     | 26% ~01m 15s      
  |++++++++++++++                                    | 27% ~01m 14s      
  |++++++++++++++                                    | 28% ~01m 12s      
  |+++++++++++++++                                   | 29% ~01m 11s      
  |+++++++++++++++                                   | 30% ~01m 10s      
  |++++++++++++++++                                  | 31% ~01m 09s      
  |++++++++++++++++                                  | 32% ~01m 08s      
  |+++++++++++++++++                                 | 33% ~01m 07s      
  |+++++++++++++++++                                 | 34% ~01m 06s      
  |++++++++++++++++++                                | 35% ~01m 05s      
  |++++++++++++++++++                                | 36% ~01m 04s      
  |+++++++++++++++++++                               | 37% ~01m 03s      
  |+++++++++++++++++++                               | 38% ~01m 02s      
  |++++++++++++++++++++                              | 39% ~01m 00s      
  |++++++++++++++++++++                              | 40% ~59s          
  |+++++++++++++++++++++                             | 41% ~58s          
  |+++++++++++++++++++++                             | 42% ~57s          
  |++++++++++++++++++++++                            | 43% ~56s          
  |++++++++++++++++++++++                            | 44% ~55s          
  |+++++++++++++++++++++++                           | 45% ~54s          
  |+++++++++++++++++++++++                           | 46% ~53s          
  |++++++++++++++++++++++++                          | 47% ~52s          
  |++++++++++++++++++++++++                          | 48% ~51s          
  |+++++++++++++++++++++++++                         | 49% ~50s          
  |+++++++++++++++++++++++++                         | 50% ~49s          
  |++++++++++++++++++++++++++                        | 51% ~48s          
  |+++++++++++++++++++++++++++                       | 52% ~47s          
  |+++++++++++++++++++++++++++                       | 53% ~46s          
  |++++++++++++++++++++++++++++                      | 54% ~45s          
  |++++++++++++++++++++++++++++                      | 55% ~44s          
  |+++++++++++++++++++++++++++++                     | 56% ~43s          
  |+++++++++++++++++++++++++++++                     | 57% ~42s          
  |++++++++++++++++++++++++++++++                    | 58% ~41s          
  |++++++++++++++++++++++++++++++                    | 59% ~40s          
  |+++++++++++++++++++++++++++++++                   | 60% ~39s          
  |+++++++++++++++++++++++++++++++                   | 61% ~38s          
  |++++++++++++++++++++++++++++++++                  | 62% ~37s          
  |++++++++++++++++++++++++++++++++                  | 63% ~36s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~35s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~34s          
  |++++++++++++++++++++++++++++++++++                | 66% ~33s          
  |++++++++++++++++++++++++++++++++++                | 67% ~33s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~32s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~31s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~30s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~28s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~27s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~26s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~25s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~24s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~23s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~22s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~21s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~20s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~19s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~18s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~17s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 39s
Calculating cluster 9

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 35s      
  |+                                                 | 2 % ~01m 35s      
  |++                                                | 3 % ~01m 33s      
  |++                                                | 4 % ~01m 34s      
  |+++                                               | 5 % ~01m 33s      
  |+++                                               | 6 % ~01m 31s      
  |++++                                              | 7 % ~01m 29s      
  |++++                                              | 8 % ~01m 28s      
  |+++++                                             | 9 % ~01m 27s      
  |+++++                                             | 10% ~01m 26s      
  |++++++                                            | 11% ~01m 26s      
  |++++++                                            | 12% ~01m 24s      
  |+++++++                                           | 13% ~01m 23s      
  |+++++++                                           | 14% ~01m 22s      
  |++++++++                                          | 15% ~01m 21s      
  |++++++++                                          | 16% ~01m 20s      
  |+++++++++                                         | 17% ~01m 19s      
  |+++++++++                                         | 18% ~01m 19s      
  |++++++++++                                        | 19% ~01m 18s      
  |++++++++++                                        | 20% ~01m 16s      
  |+++++++++++                                       | 21% ~01m 16s      
  |+++++++++++                                       | 22% ~01m 15s      
  |++++++++++++                                      | 23% ~01m 14s      
  |++++++++++++                                      | 24% ~01m 13s      
  |+++++++++++++                                     | 25% ~01m 12s      
  |+++++++++++++                                     | 26% ~01m 11s      
  |++++++++++++++                                    | 27% ~01m 10s      
  |++++++++++++++                                    | 28% ~01m 09s      
  |+++++++++++++++                                   | 29% ~01m 08s      
  |+++++++++++++++                                   | 30% ~01m 07s      
  |++++++++++++++++                                  | 31% ~01m 06s      
  |++++++++++++++++                                  | 32% ~01m 05s      
  |+++++++++++++++++                                 | 33% ~01m 04s      
  |+++++++++++++++++                                 | 34% ~01m 03s      
  |++++++++++++++++++                                | 35% ~01m 02s      
  |++++++++++++++++++                                | 36% ~01m 01s      
  |+++++++++++++++++++                               | 37% ~01m 00s      
  |+++++++++++++++++++                               | 38% ~59s          
  |++++++++++++++++++++                              | 39% ~58s          
  |++++++++++++++++++++                              | 40% ~57s          
  |+++++++++++++++++++++                             | 41% ~56s          
  |+++++++++++++++++++++                             | 42% ~58s          
  |++++++++++++++++++++++                            | 43% ~57s          
  |++++++++++++++++++++++                            | 44% ~56s          
  |+++++++++++++++++++++++                           | 45% ~55s          
  |+++++++++++++++++++++++                           | 46% ~54s          
  |++++++++++++++++++++++++                          | 47% ~52s          
  |++++++++++++++++++++++++                          | 48% ~51s          
  |+++++++++++++++++++++++++                         | 49% ~50s          
  |+++++++++++++++++++++++++                         | 50% ~49s          
  |++++++++++++++++++++++++++                        | 51% ~48s          
  |++++++++++++++++++++++++++                        | 52% ~47s          
  |+++++++++++++++++++++++++++                       | 53% ~46s          
  |+++++++++++++++++++++++++++                       | 54% ~45s          
  |++++++++++++++++++++++++++++                      | 55% ~44s          
  |++++++++++++++++++++++++++++                      | 56% ~43s          
  |+++++++++++++++++++++++++++++                     | 57% ~42s          
  |+++++++++++++++++++++++++++++                     | 58% ~41s          
  |++++++++++++++++++++++++++++++                    | 59% ~40s          
  |++++++++++++++++++++++++++++++                    | 60% ~39s          
  |+++++++++++++++++++++++++++++++                   | 61% ~38s          
  |+++++++++++++++++++++++++++++++                   | 62% ~37s          
  |++++++++++++++++++++++++++++++++                  | 63% ~36s          
  |++++++++++++++++++++++++++++++++                  | 64% ~35s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~34s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~33s          
  |++++++++++++++++++++++++++++++++++                | 67% ~32s          
  |++++++++++++++++++++++++++++++++++                | 68% ~31s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~30s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~29s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~28s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~27s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~26s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~25s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~25s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~24s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~23s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~22s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~21s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~20s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~19s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~18s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~17s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~16s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~14s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 39s
Calculating cluster 10

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~02m 55s      
  |++                                                | 2 % ~02m 47s      
  |++                                                | 3 % ~02m 43s      
  |+++                                               | 4 % ~02m 40s      
  |+++                                               | 5 % ~02m 37s      
  |++++                                              | 6 % ~02m 34s      
  |++++                                              | 7 % ~02m 33s      
  |+++++                                             | 8 % ~02m 31s      
  |+++++                                             | 9 % ~02m 28s      
  |++++++                                            | 10% ~02m 27s      
  |++++++                                            | 11% ~02m 25s      
  |+++++++                                           | 12% ~02m 22s      
  |+++++++                                           | 13% ~02m 20s      
  |++++++++                                          | 14% ~02m 18s      
  |++++++++                                          | 15% ~02m 17s      
  |+++++++++                                         | 16% ~02m 15s      
  |+++++++++                                         | 18% ~02m 13s      
  |++++++++++                                        | 19% ~02m 18s      
  |++++++++++                                        | 20% ~02m 16s      
  |+++++++++++                                       | 21% ~02m 14s      
  |+++++++++++                                       | 22% ~02m 12s      
  |++++++++++++                                      | 23% ~02m 10s      
  |++++++++++++                                      | 24% ~02m 08s      
  |+++++++++++++                                     | 25% ~02m 06s      
  |+++++++++++++                                     | 26% ~02m 04s      
  |++++++++++++++                                    | 27% ~02m 02s      
  |++++++++++++++                                    | 28% ~01m 60s      
  |+++++++++++++++                                   | 29% ~01m 58s      
  |+++++++++++++++                                   | 30% ~01m 56s      
  |++++++++++++++++                                  | 31% ~01m 54s      
  |++++++++++++++++                                  | 32% ~01m 52s      
  |+++++++++++++++++                                 | 33% ~01m 50s      
  |++++++++++++++++++                                | 34% ~01m 49s      
  |++++++++++++++++++                                | 35% ~01m 47s      
  |+++++++++++++++++++                               | 36% ~01m 45s      
  |+++++++++++++++++++                               | 37% ~01m 43s      
  |++++++++++++++++++++                              | 38% ~01m 42s      
  |++++++++++++++++++++                              | 39% ~01m 40s      
  |+++++++++++++++++++++                             | 40% ~01m 38s      
  |+++++++++++++++++++++                             | 41% ~01m 37s      
  |++++++++++++++++++++++                            | 42% ~01m 37s      
  |++++++++++++++++++++++                            | 43% ~01m 35s      
  |+++++++++++++++++++++++                           | 44% ~01m 34s      
  |+++++++++++++++++++++++                           | 45% ~01m 32s      
  |++++++++++++++++++++++++                          | 46% ~01m 30s      
  |++++++++++++++++++++++++                          | 47% ~01m 28s      
  |+++++++++++++++++++++++++                         | 48% ~01m 26s      
  |+++++++++++++++++++++++++                         | 49% ~01m 25s      
  |++++++++++++++++++++++++++                        | 51% ~01m 23s      
  |++++++++++++++++++++++++++                        | 52% ~01m 21s      
  |+++++++++++++++++++++++++++                       | 53% ~01m 19s      
  |+++++++++++++++++++++++++++                       | 54% ~01m 18s      
  |++++++++++++++++++++++++++++                      | 55% ~01m 16s      
  |++++++++++++++++++++++++++++                      | 56% ~01m 14s      
  |+++++++++++++++++++++++++++++                     | 57% ~01m 12s      
  |+++++++++++++++++++++++++++++                     | 58% ~01m 11s      
  |++++++++++++++++++++++++++++++                    | 59% ~01m 09s      
  |++++++++++++++++++++++++++++++                    | 60% ~01m 07s      
  |+++++++++++++++++++++++++++++++                   | 61% ~01m 08s      
  |+++++++++++++++++++++++++++++++                   | 62% ~01m 06s      
  |++++++++++++++++++++++++++++++++                  | 63% ~01m 04s      
  |++++++++++++++++++++++++++++++++                  | 64% ~01m 02s      
  |+++++++++++++++++++++++++++++++++                 | 65% ~01m 01s      
  |+++++++++++++++++++++++++++++++++                 | 66% ~59s          
  |++++++++++++++++++++++++++++++++++                | 67% ~57s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~55s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~53s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~51s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~50s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~48s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~46s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~44s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~42s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~41s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~39s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~37s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~38s          
  |+++++++++++++++++++++++++++++++++++++++++         | 80% ~36s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~34s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~32s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~30s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~28s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~26s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~24s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~22s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~20s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~19s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~17s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~15s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~11s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02m 57s
DAGs_cl <- 
  DAGs_cl %>%
  mutate(positive=avg_logFC > 0)
top10_markers <- DAGs_cl %>%
  filter(positive) %>%
  group_by(cluster) %>%
  arrange(p_val_adj) %>%
  top_n(10) %>%
  pull(gene) %>%
  unique()
Selecting by positive
top10_markers <- DAGs_cl %>%
  filter(positive) %>%
  group_by(cluster) %>%
  # arrange(p_val_adj) %>%
  top_n(10,wt = - p_val_adj) %>%
  pull(gene)
DotPlot(f74.seu, features = top10_markers) +
  coord_flip()

Expression of markers in RNA data

map(1:10, ~ plot_cluster_marker_ATACvsRNA(.x))
All cells have the same value (0) of MIR4300HG.All cells have the same value (0) of NOS1.All cells have the same value (0) of RPH3A.Cannot convert object of class listggarrange into a grob.All cells have the same value (0) of C5orf66-AS2.All cells have the same value (0) of CYP3A43.
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

[[8]]

[[9]]

[[10]]

Differential analysis only between the putative T-cell clusters

Only between cluster 1 and 2

Embedding on most variable genes in ATAC (not in gene expression)

Save markers

Thoughts

LS0tCnRpdGxlOiAiU25hcCBBVEFDIGRhdGEgcHJvY2Vzc2luZyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3J9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyh7CiAgbGlicmFyeShTbmFwQVRBQykKICBsaWJyYXJ5KGxlaWRlbikKICBsaWJyYXJ5KHVtYXApCiAgbGlicmFyeShHZW5vbWljUmFuZ2VzKQogIGxpYnJhcnkoem9vKQogIGxpYnJhcnkodGlkeXZlcnNlKQogIGxpYnJhcnkoY293cGxvdCkKICBsaWJyYXJ5KGdncHVicikKfSkKc291cmNlKCJ+L211bHRpT21pY19iZW5jaG1hcmsvcHJlcHJvY2Vzcy9zZWxlY3RGZWF0dXJlcy5SIikKYGBgCmBgYHtyfQojIyBMb2FkIGFuZCBlbWJlZCBSTkEgZGF0YQpmNzQuc2NlLmxpc3QgPC0gcmVhZFJEUygifi9teV9kYXRhL2ludGVncmF0ZWRfdGh5bXVzL0Y3NF9TQ0VsaXN0XzIwMTkxMDE3LlJEUyIpCmY3NC5ybmEgPC0gZjc0LnNjZS5saXN0JFJOQQoKZjc0LnJuYS5zZXUgPC0gYXMuU2V1cmF0KGY3NC5ybmEsIHZlcmJvc2U9RkFMU0UpCmludGVncmF0ZV9mZWF0dXJlcyA8LSBIVkdfU2V1cmF0KGY3NC5ybmEsIG5mZWF0dXJlcyA9IDMwMDApClZhcmlhYmxlRmVhdHVyZXMoZjc0LnJuYS5zZXUpIDwtIGludGVncmF0ZV9mZWF0dXJlcwpmNzQucm5hLnNldSA8LSBTY2FsZURhdGEoZjc0LnJuYS5zZXUsIGRvLmNlbnRlciA9IFRSVUUsIHZlcmJvc2U9RkFMU0UpCmY3NC5ybmEuc2V1IDwtIFJ1blBDQShmNzQucm5hLnNldSkgCmY3NC5ybmEuc2V1IDwtIFJ1blVNQVAoZjc0LnJuYS5zZXUsIHJlZHVjdGlvbiA9ICJwY2EiLCBkaW1zPTE6NTApIAoKIyMgQWRkIGNlbGwgdHlwZSBhbm5vdGF0aW9uCmFubm90YXRpb24uZGYgPC0gcmVhZC5jc3YoIn4vbXlfZGF0YS9GNzRfUk5BX29icy5jc3YiKQphbm5vdGF0aW9uLmRmIDwtIGFubm90YXRpb24uZGYgJT4lCiAgbXV0YXRlKGNlbGw9c3RyX3JlbW92ZShhcy5jaGFyYWN0ZXIoWCksICJGNzRfMV8iKSAlPiUgc3RyX2MoaWZlbHNlKGJhdGNoPT0wLCdfMScsICJfMiIpKSkgCgpmNzQucm5hLnNldUBtZXRhLmRhdGEgPC0gZjc0LnJuYS5zZXVAbWV0YS5kYXRhICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2VsbCIpICU+JQogIGxlZnRfam9pbihhbm5vdGF0aW9uLmRmKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoImNlbGwiKQoKYGBgCgoKRmlyc3QgSSBoYXZlIG1hZGUgdGhlIHNuYXAgZmlsZSBmcm9tIHRoZSBjZWxscmFuZ2VyIGBmcmFnbWVudHMudHN2YCBmaWxlLiBTY3JpcHQgaXMgYG11bHRpT21pY19iZW5jaG1hcmsvcHJlcHJvY2Vzcy9mcmFnbWVudHMyc25hcC5zaGAuCgpGb2xsb3dpbmcgW2ludGVncmF0aW9uIHZpZ25ldHRlXShodHRwczovL2dpdGh1Yi5jb20vcjNmYW5nL1NuYXBBVEFDL2Jsb2IvbWFzdGVyL2V4YW1wbGVzLzEwWF9QQk1DXzE1Sy9SRUFETUUubWQpIAoKIyMjIEJhcmNvZGUgc2VsZWN0aW9uCkZpbHRlcmluZyBiYXNlZCBvbiBudW1iZXIgb2YgcmVhZHMgcGVyIGNlbGwgYW5kIHJhdGlvIG9mIGZyYWdtZW50cyB0aGF0IGFyZSB3aXRoaW4gcHJvbW90ZXJzCmBgYHtyfQpzbmFwLmZpbGVzIDwtICJ+L215X2RhdGEvY2VsbHJhbmdlci1hdGFjMTEwX2NvdW50XzMwNDM5X1dTU1M4MDM4MzYwX0dSQ2gzOC0xXzFfMC5zbmFwIgpzYW1wbGUubmFtZXMgPC0gIkY3NCIKYmFyY29kZS5maWxlcyA8LSAnfi9teV9kYXRhL3NpbmdsZWNlbGwuY3N2JwoKeC5zcC5scyA8LSBsaXN0KGNyZWF0ZVNuYXAoc25hcC5maWxlcywgc2FtcGxlLm5hbWVzKSkKbmFtZXMoeC5zcC5scykgPSBzYW1wbGUubmFtZXMKeC5zcC5scwoKYmFyY29kZS5scyA9IGxhcHBseShzZXEoc25hcC5maWxlcyksIGZ1bmN0aW9uKGkpewogICAgYmFyY29kZXMgPSByZWFkLmNzdigKICAgICAgICBiYXJjb2RlLmZpbGVzW2ldLCAKICAgICAgICBoZWFkPVRSVUUKICAgICk7CiAgICAjIHJlbW92ZSBOTyBCQVJPQ0RFIGxpbmUKICAgIGJhcmNvZGVzID0gYmFyY29kZXNbMjpucm93KGJhcmNvZGVzKSxdOwogICAgYmFyY29kZXMkbG9nVU1JID0gbG9nMTAoYmFyY29kZXMkcGFzc2VkX2ZpbHRlcnMgKyAxKTsKICAgIGJhcmNvZGVzJHByb21vdGVyX3JhdGlvID0gKGJhcmNvZGVzJHByb21vdGVyX3JlZ2lvbl9mcmFnbWVudHMrMSkgLyAoYmFyY29kZXMkcGFzc2VkX2ZpbHRlcnMgKyAxKTsKICAgIGJhcmNvZGVzCiAgfSkKCnBsb3RzID0gbGFwcGx5KHNlcShzbmFwLmZpbGVzKSwgZnVuY3Rpb24oaSl7CiAgICBwMSA9IGdncGxvdCgKICAgICAgICBiYXJjb2RlLmxzW1tpXV0sIAogICAgICAgIGFlcyh4PWxvZ1VNSSwgeT1wcm9tb3Rlcl9yYXRpbykpICsgCiAgICAgICAgZ2VvbV9wb2ludChzaXplPTAuMywgY29sPSJncmV5IikgKwogICAgICAgIHRoZW1lX2NsYXNzaWMoKQkrCiAgICAgICAgZ2d0aXRsZShzYW1wbGUubmFtZXNbW2ldXSkgKwogICAgICAgIHlsaW0oMCwgMSkgKyB4bGltKDAsIDYpICsgCiAgICAgICAgbGFicyh4ID0gImxvZzEwKGNvdW50cykiLCB5PSJwcm9tb3RlciByYXRpbyIpCiAgICAgICAgcDEKICAgIH0pCgojIyBTZWxlY3QgYW5kIHZpeiBjdXRvZmZzCmN1dG9mZi5sb2dVTUkubG93ID0gMy4zCmN1dG9mZi5sb2dVTUkuaGlnaCA9IDQuOApjdXRvZmYuRlJJUC5sb3cgPSAwLjI1CmN1dG9mZi5GUklQLmhpZ2ggPSAwLjY1CgoKcGxvdHNbWzFdXSArIAogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGMoY3V0b2ZmLmxvZ1VNSS5sb3dbMV0sY3V0b2ZmLmxvZ1VNSS5oaWdoWzFdKSwgbGluZXR5cGU9MikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IGMoY3V0b2ZmLkZSSVAubG93WzFdLGN1dG9mZi5GUklQLmhpZ2hbMV0pLCBsaW5ldHlwZT0yKQpgYGAKYGBge3J9CmJhcmNvZGUubHMgPSBsYXBwbHkoc2VxKHNuYXAuZmlsZXMpLCBmdW5jdGlvbihpKXsKICBiYXJjb2RlcyA9IGJhcmNvZGUubHNbW2ldXTsKICBpZHggPSB3aGljaCgKICAgICAgYmFyY29kZXMkbG9nVU1JID49IGN1dG9mZi5sb2dVTUkubG93W2ldICYgCiAgICAgIGJhcmNvZGVzJGxvZ1VNSSA8PSBjdXRvZmYubG9nVU1JLmhpZ2hbaV0gJiAKICAgICAgYmFyY29kZXMkcHJvbW90ZXJfcmF0aW8gPj0gY3V0b2ZmLkZSSVAubG93W2ldICYKICAgICAgYmFyY29kZXMkcHJvbW90ZXJfcmF0aW8gPD0gY3V0b2ZmLkZSSVAuaGlnaFtpXQogICk7CiAgYmFyY29kZXNbaWR4LF0KfSk7Cnguc3AubHMgPSBsYXBwbHkoc2VxKHNuYXAuZmlsZXMpLCBmdW5jdGlvbihpKXsKICBiYXJjb2RlcyA9IGJhcmNvZGUubHNbW2ldXTsKICB4LnNwID0geC5zcC5sc1tbaV1dOwogIGJhcmNvZGUuc2hhcmVkID0gaW50ZXJzZWN0KHguc3BAYmFyY29kZSwgYmFyY29kZXMkYmFyY29kZSk7CiAgeC5zcCA9IHguc3BbbWF0Y2goYmFyY29kZS5zaGFyZWQsIHguc3BAYmFyY29kZSksXTsKICBiYXJjb2RlcyA9IGJhcmNvZGVzW21hdGNoKGJhcmNvZGUuc2hhcmVkLCBiYXJjb2RlcyRiYXJjb2RlKSxdOwogIHguc3BAbWV0YURhdGEgPSBiYXJjb2RlczsKICB4LnNwCn0pCm5hbWVzKHguc3AubHMpID0gc2FtcGxlLm5hbWVzOwp4LnNwID0gUmVkdWNlKHNuYXBSYmluZCwgeC5zcC5scyk7Cnguc3BAbWV0YURhdGFbInNhbXBsZSJdID0geC5zcEBzYW1wbGU7Cnguc3AKYGBgCgojIyMgQWRkIGNlbGwtYnktYmluIG1hdHJpeApgYGB7cn0KeC5zcCA9IGFkZEJtYXRUb1NuYXAoeC5zcCwgYmluLnNpemUgPSA1MDAwKQpgYGAKIyMgQmluYXJpemUgbWF0cml4ClNvbWUgaXRlbXMgaW4gdGhlIGNvdW50IG1hdHJpeCBoYXZlIGFibm9ybWFsbHkgaGlnaCBjb3ZlcmFnZSBwZXJoYXBzIGR1ZSB0byB0aGUgYWxpZ25tZW50IGVycm9ycy4gVGhlcmVmb3JlLCB3ZSBuZXh0IHJlbW92ZSB0b3AgMC4xJSBpdGVtcyBpbiB0aGUgY291bnQgbWF0cml4IGFuZCB0aGVuIGNvbnZlcnQgdGhlIHJlbWFpbmluZyBub24temVybyB2YWx1ZXMgdG8gMS4KYGBge3J9Cnguc3AgPSBtYWtlQmluYXJ5KHguc3AsIG1hdD0iYm1hdCIpCnguc3AKYGBgCgojIyBGaWx0ZXIgYmlucwpGaWx0ZXIgb3V0IGJpbnMgb3ZlcmxhcHBpbmcgdyBFTkNPREUgYmxhY2tsaXN0CgpgYGB7cn0KYmxhY2tfbGlzdCA9IHJlYWQudGFibGUoIn4vYW5ub3RhdGlvbnMvaGczOC5ibGFja2xpc3QuYmVkLmd6IikKYmxhY2tfbGlzdC5nciA9IEdSYW5nZXMoCiAgYmxhY2tfbGlzdFssMV0sIAogIElSYW5nZXMoYmxhY2tfbGlzdFssMl0sIGJsYWNrX2xpc3RbLDNdKQopOwppZHkgPSBxdWVyeUhpdHMoCiAgZmluZE92ZXJsYXBzKHguc3BAZmVhdHVyZSwgYmxhY2tfbGlzdC5ncikKKTsKaWYobGVuZ3RoKGlkeSkgPiAwKXsKICB4LnNwID0geC5zcFssLWlkeSwgbWF0PSJibWF0Il07Cn07Cnguc3AKYGBgCgpFeGNsdWRlIGJhZCBjaHJvbW9zb21lcwpgYGB7cn0KY2hyLmV4Y2x1ZGUgPSBzZXFsZXZlbHMoeC5zcEBmZWF0dXJlKVtncmVwKCJyYW5kb218Y2hyTSIsIHNlcWxldmVscyh4LnNwQGZlYXR1cmUpKV0KaWR5ID0gZ3JlcChwYXN0ZShjaHIuZXhjbHVkZSwgY29sbGFwc2U9InwiKSwgeC5zcEBmZWF0dXJlKQppZihsZW5ndGgoaWR5KSA+IDApewogIHguc3AgPSB4LnNwWywtaWR5LCBtYXQ9ImJtYXQiXQp9Cnguc3AKYGBgCgpyZW1vdmUgdGhlIHRvcCA1JSBiaW5zIHRoYXQgb3ZlcmxhcCB3aXRoIGludmFyaWFudCBmZWF0dXJlcyBzdWNoIGFzIHRoZSBob3VzZSBrZWVwaW5nIGdlbmUgcHJvbW90ZXJzCgpgYGB7cn0KYmluLmNvdiA9IGxvZzEwKE1hdHJpeDo6Y29sU3Vtcyh4LnNwQGJtYXQpKzEpCiMgYmluLmNvdiA9IE1hdHJpeDo6Y29sU3Vtcyh4LnNwQGJtYXQpCmhpc3QoCiAgYmluLmNvdltiaW4uY292ID4gMF0sIAogIHhsYWI9ImxvZzEwKGJpbiBjb3YpIiwgCiAgbWFpbj0ibG9nMTAoQmluIENvdikiLCAKICBjb2w9ImxpZ2h0Ymx1ZSIsIAogICMgeGxpbT1jKDAsIDUpLAogIGJyZWFrcz0xMDAKKTsKYmluLmN1dG9mZiA9IHF1YW50aWxlKGJpbi5jb3ZbYmluLmNvdiA+IDBdLCAwLjk1KQppZHkgPSB3aGljaChiaW4uY292IDw9IGJpbi5jdXRvZmYgJiBiaW4uY292ID4gMCkKeC5zcCA9IHguc3BbLCBpZHksIG1hdD0iYm1hdCJdOwp4LnNwCmBgYAoKUmVtb3ZlIGFueSBjZWxscyBvZiBiaW4gY292ZXJhZ2UgbGVzcyB0aGFuIDEsMDAwLiBUaGUgcmF0aW9uYWwgYmVoaW5kIHRoaXMgaXMgdGhhdCBzb21lIGNlbGxzIG1heSBoYXZlIGhpZ2ggbnVtYmVyIG9mIHVuaXF1ZSBmcmFnbWVudHMgYnV0IGVuZCB1cCB3aXRoIGxvdyBiaW4gY292ZXJhZ2UgYWZ0ZXIgZmlsdGVyaW5nLiBUaGlzIHN0ZXAgaXMgb3B0aW9uYWwgYnV0IGhpZ2hseSByZWNvbW1hbmRlZC4KYGBge3J9CmlkeCA9IHdoaWNoKE1hdHJpeDo6cm93U3Vtcyh4LnNwQGJtYXQpID4gMTAwMCk7Cnguc3AgPSB4LnNwW2lkeCxdOwp4LnNwCmBgYAoKIyMgRGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uClVzZXMgZGlmZnVzaW9uIG1hcCBhbGdvcml0aG0gdyBzYW1wbGluZyB0ZWNobmlxdWUgdG8gbWFrZSBpdCBmYXN0LgoKYGBge3J9CiMjIFNhbXBsZSAxMDAgY2VsbHMgYXMgbGFuZG1hcmtzIApyb3cuY292cy5kZW5zIDwtIGRlbnNpdHkoCiAgeCA9IHguc3BAbWV0YURhdGFbLCJsb2dVTUkiXSwgCiAgYncgPSAnbnJkJywgYWRqdXN0ID0gMQopCnNhbXBsaW5nX3Byb2IgPC0gMSAvIChhcHByb3goeCA9IHJvdy5jb3ZzLmRlbnMkeCwgeSA9IHJvdy5jb3ZzLmRlbnMkeSwgeG91dCA9IHguc3BAbWV0YURhdGFbLCJsb2dVTUkiXSkkeSArIC5NYWNoaW5lJGRvdWJsZS5lcHMpOwpzZXQuc2VlZCgxKQppZHgubGFuZG1hcmsuZHMgPC0gc29ydChzYW1wbGUoeCA9IHNlcShucm93KHguc3ApKSwgc2l6ZSA9IDEwMDAsIHByb2IgPSBzYW1wbGluZ19wcm9iKSkKCiMjIFNwbGl0IGJldHdlZW4gbGFuZG1hcmsgYW5kIHF1ZXJ5IGNlbGxzCngubGFuZG1hcmsuc3AgPSB4LnNwW2lkeC5sYW5kbWFyay5kcyxdOwp4LnF1ZXJ5LnNwID0geC5zcFstaWR4LmxhbmRtYXJrLmRzLF07CgojIyBSdW4gZGlmZnVzaW9uIG1hcCBvbiBsYW5kbWFyawp4LmxhbmRtYXJrLnNwID0gcnVuRGlmZnVzaW9uTWFwcygKICBvYmo9IHgubGFuZG1hcmsuc3AsCiAgaW5wdXQubWF0PSJibWF0IiwgCiAgbnVtLmVpZ3M9NTAKKTsKeC5sYW5kbWFyay5zcEBtZXRhRGF0YSRsYW5kbWFyayA9IDE7CgojIyBQcm9qZWN0IHF1ZXJ5IGNlbGxzCngucXVlcnkuc3AgPSBydW5EaWZmdXNpb25NYXBzRXh0ZW5zaW9uKAogIG9iajE9eC5sYW5kbWFyay5zcCwgCiAgb2JqMj14LnF1ZXJ5LnNwLAogIGlucHV0Lm1hdD0iYm1hdCIKKQp4LnF1ZXJ5LnNwQG1ldGFEYXRhJGxhbmRtYXJrID0gMDsKCiMjIENvbWJpbmUgCnguc3AgPSBzbmFwUmJpbmQoeC5sYW5kbWFyay5zcCwgeC5xdWVyeS5zcCk7Cnguc3AgPSB4LnNwW29yZGVyKHguc3BAbWV0YURhdGFbLCJzYW1wbGUiXSldOyAjSU1QT1JUQU5UCmBgYAoKVG8gZGV0ZXJtaW5lIHNpZ25pZmljYW50IGRpZmZ1c2lvbiBjb21wb25lbnRzOgo+IFdlIHVzZSBhbiBhZCBob2MgbWV0aG9kIGJ5IHNpbXBseSBsb29raW5nIGF0IGEgcGFpcndpc2UgcGxvdCBhbmQgc2VsZWN0IHRoZSBudW1iZXIgb2YgZWlnZW4gdmVjdG9ycyB0aGF0IHRoZSBzY2F0dGVyIHBsb3Qgc3RhcnRzIGxvb2tpbmcgbGlrZSBhIGJsb2IuIEluIHRoZSBiZWxvdyBleGFtcGxlLCB3ZSBjaG9vc2UgdGhlIGZpcnN0IDE1IGVpZ2VuIHZlY3RvcnMuCgpgYGB7cn0KcGxvdERpbVJlZHVjdFBXKAogICAgb2JqPXguc3AsIAogICAgZWlncy5kaW1zPTE6NTAsCiAgICBwb2ludC5zaXplPTAuMywKICAgIHBvaW50LmNvbG9yPSJncmV5IiwKICAgIHBvaW50LnNoYXBlPTE5LAogICAgcG9pbnQuYWxwaGE9MC42LAogICAgZG93bi5zYW1wbGU9NTAwMCwKICAgIHBkZi5maWxlLm5hbWU9TlVMTCwgCiAgICBwZGYuaGVpZ2h0PTcsIAogICAgcGRmLndpZHRoPTcKICApOwpgYGAKCiMjIENsdXN0ZXJpbmcgYW5kIHZpc3VhbGl6YXRpb24KYGBge3J9CnNpZ25pZi5kaW1zID0gMToxNgp4LnNwID0gcnVuS05OKAogICAgb2JqPXguc3AsCiAgICBlaWdzLmRpbXM9c2lnbmlmLmRpbXMsCiAgICBrPTE1CiAgKTsKCnguc3A9cnVuQ2x1c3RlcigKICAgIG9iaj14LnNwLAogICAgdG1wLmZvbGRlcj10ZW1wZGlyKCksCiAgICBsb3V2YWluLmxpYj0ibGVpZGVuIiwKICAgIHNlZWQudXNlPTEwLAogICAgcmVzb2x1dGlvbj0wLjcKICApOwpgYGAKClZpc3VhbGl6YXRpb24KYGBge3IsIGZpZy5oZWlnaHQ9NSwgZmlnLndpZHRoPTV9Cnguc3AgPSBydW5WaXooCiBvYmo9eC5zcCwgCiB0bXAuZm9sZGVyPXRlbXBkaXIoKSwKIGRpbXM9MiwKIGVpZ3MuZGltcz1zaWduaWYuZGltcywgCiBtZXRob2Q9InVtYXAiLAogc2VlZC51c2U9MTAKKQoKcGxvdFZpeigKICAgIG9iaj0geC5zcCwKICAgIG1ldGhvZD0idW1hcCIsIAogICAgbWFpbj0iQ2x1c3RlciIsCiAgICBwb2ludC5jb2xvcj14LnNwQGNsdXN0ZXIsIAogICAgcG9pbnQuc2l6ZT0wLjIsIAogICAgcG9pbnQuc2hhcGU9MTksIAogICAgdGV4dC5hZGQ9VFJVRSwKICAgIHRleHQuc2l6ZT0xLAogICAgdGV4dC5jb2xvcj0iYmxhY2siLAogICAgZG93bi5zYW1wbGU9MTAwMDAsCiAgICBsZWdlbmQuYWRkPUZBTFNFCiAgKTsKCmBgYAoKCjwhLS0gIyMgT3V0bGllciBhbmFseXNpcyAtLT4KPCEtLSBgYGB7cn0gLS0+CjwhLS0gZGF0YS5mcmFtZSh4LnNwQHVtYXApICU+JSAtLT4KPCEtLSAgIG11dGF0ZShjZWxsPXguc3BAYmFyY29kZSkgJT4lIC0tPgo8IS0tICAgIyBhcnJhbmdlKHVtYXAuMSkgLS0+CjwhLS0gICBnZ3Bsb3QoYWVzKHVtYXAuMSwgdW1hcC4yKSkgKyAtLT4KPCEtLSAgIGdlb21fcG9pbnQoc2l6ZT0wLjIpIC0tPgo8IS0tIGBgYCAtLT4KPCEtLSBgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9MTV9IC0tPgo8IS0tIG91dGxpZXIuaXguMSA8LSBkYXRhLmZyYW1lKHguc3BAdW1hcCkgJT4lIC0tPgo8IS0tICAgbXV0YXRlKGNlbGw9eC5zcEBiYXJjb2RlKSAlPiUgLS0+CjwhLS0gICByb3dpZF90b19jb2x1bW4oKSAlPiUgLS0+CjwhLS0gICBkcGx5cjo6ZmlsdGVyKHVtYXAuMSA+IDEwMCkgJT4lIC0tPgo8IS0tICAgcHVsbChyb3dpZCkgLS0+CjwhLS0gb3V0bGllci5peC4yIDwtIGRhdGEuZnJhbWUoeC5zcEB1bWFwKSAlPiUgLS0+CjwhLS0gICBtdXRhdGUoY2VsbD14LnNwQGJhcmNvZGUpICU+JSAtLT4KPCEtLSAgIHJvd2lkX3RvX2NvbHVtbigpICU+JSAtLT4KPCEtLSAgIGRwbHlyOjpmaWx0ZXIodW1hcC4yIDwgLTUwKSAlPiUgLS0+CjwhLS0gICBwdWxsKHJvd2lkKSAtLT4KCjwhLS0gc21wLm90aGVyIDwtIHNhbXBsZShzZXRkaWZmKDE6bGVuZ3RoKHguc3BAYmFyY29kZSksIGMob3V0bGllci5peC4xLCBvdXRsaWVyLml4LjIpKSwgMTAwKSAtLT4KCjwhLS0gbG9uZy5vdXRsaWVyLmJtYXQgPC0gLS0+CjwhLS0gICB4LnNwQGJtYXRbYyhvdXRsaWVyLml4LjEsIG91dGxpZXIuaXguMiwgc21wLm90aGVyKSxdICU+JSAtLT4KPCEtLSAgIGFzLm1hdHJpeCgpICU+JSAtLT4KPCEtLSAgIG1lbHQodmFsdWUubmFtZSA9ICJhY2MiLCB2YXJuYW1lcz1jKCJiYXJjb2RlIiwgImJpbiIpKSAtLT4KCjwhLS0gIyBsb25nLm91dGxpZXIuYm1hdCAlPiUgLS0+CjwhLS0gIyAgICMgZHBseXI6OmZpbHRlcihiYXJjb2RlPT0nQUFDQUFBR0dUQUdBQ0dDQS0xJykgJT4lIC0tPgo8IS0tICMgICBtdXRhdGUoYmlnLmJpbnM9Y3V0KGJpbixicmVha3MgPSAxMDAwMCkpICU+JSAtLT4KPCEtLSAjICAgZ3JvdXBfYnkoYmFyY29kZSkgJT4lIC0tPgo8IS0tICMgICBhcnJhbmdlKGJpbikgJT4lIC0tPgo8IS0tICMgICBtdXRhdGUocnVubWVhbj1yb2xsbWVhbihhY2MsayA9IDEwMDAwKVsxOm4oKV0pICU+JSAtLT4KPCEtLSAjICAgdW5ncm91cCgpICU+JSAtLT4KPCEtLSAjICAgZ3JvdXBfYnkoYmFyY29kZSwgYmlnLmJpbnMpICU+JSAtLT4KPCEtLSAjICAgc3VtbWFyaXNlKGJpbi5tZWFuPW1lYW4ocnVubWVhbikpICU+JSAtLT4KPCEtLSAjICAgbXV0YXRlKGJpZy5iaW5zPWFzLm51bWVyaWMoYmlnLmJpbnMpKSAlPiUgLS0+CjwhLS0gIyAgIG11dGF0ZShvdXRsaWVyPWlmZWxzZShiYXJjb2RlICVpbiUgeC5zcEBiYXJjb2RlW291dGxpZXIuaXhdLCBUUlVFLCBGQUxTRSkpICU+JSAtLT4KPCEtLSAjICAgZ2dwbG90KGFlcyggYmlnLmJpbnMsIGJhcmNvZGUsIGZpbGw9YmluLm1lYW4pKSArIC0tPgo8IS0tICMgICBnZW9tX3RpbGUoKSArIC0tPgo8IS0tICMgICBzY2FsZV9maWxsX3ZpcmlkaXNfYygpICsgLS0+CjwhLS0gIyAgIGZhY2V0X3dyYXAob3V0bGllcn4uLCBzY2FsZXM9ImZyZWVfeSIsIG5jb2w9MSwgbnJvdz0yKSAtLT4KPCEtLSAjICAgdW5ncm91cCgpICU+JSAtLT4KPCEtLSAjICAgZ2dwbG90KGFlcyhiaW4sIHJ1bm1lYW4pKSArIC0tPgo8IS0tICMgICBmYWNldF93cmFwKGJpZy5iaW5zfi4sIHNjYWxlPSJmcmVlX3giLCBuY29sPTIpICsgLS0+CjwhLS0gIyAgIGdlb21fbGluZShhZXMoZ3JvdXA9YmFyY29kZSwgY29sb3I9b3V0bGllciksIHNpemU9MC41LCBhbHBoYT0wLjUpIC0tPgo8IS0tICMgICAgLS0+CjwhLS0gYGBgIC0tPgoKPCEtLSBgYGB7cn0gLS0+CjwhLS0gbG9uZy5vdXRsaWVyLmJtYXQgJT4lIC0tPgo8IS0tICAgZ3JvdXBfYnkoYmFyY29kZSkgJT4lIC0tPgo8IS0tICAgc3VtbWFyaXNlKGFjYz1zdW0oYWNjKSkgJT4lIC0tPgo8IS0tICAgbXV0YXRlKG91dGxpZXI9Y2FzZV93aGVuKGJhcmNvZGUgJWluJSB4LnNwQGJhcmNvZGVbb3V0bGllci5peC4xXSB+ICAib3V0MSIsICAtLT4KPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJjb2RlICVpbiUgeC5zcEBiYXJjb2RlW291dGxpZXIuaXguMl0gfiAib3V0MiIsIC0tPgo8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIH4gJ290aGVyJykpICU+JSAtLT4KPCEtLSAgICMgbXV0YXRlKG91dGxpZXI9aWZlbHNlKGJhcmNvZGUgJWluJSB4LnNwQGJhcmNvZGVbb3V0bGllci5peC4yXSwgIm91dDIiLCBGQUxTRSkpICU+JSAtLT4KPCEtLSAgIGdncGxvdChhZXMob3V0bGllciwgYWNjKSkgKyAtLT4KPCEtLSAgIGdnYmVlc3dhcm06Omdlb21fcXVhc2lyYW5kb20oKSAtLT4KPCEtLSBgYGAgLS0+CgoKIyMgTWFrZSBnZW5lIG1hdHJpeApgYGB7cn0KdHJhbnNjcmlwdHMuZ3IgPSBydHJhY2tsYXllcjo6aW1wb3J0KCJ+L0hvbW9fc2FwaWVucy5HUkNoMzguOTMuZmlsdGVyZWQuZ3RmIikKY29sbmFtZXModHJhbnNjcmlwdHMuZ3JAZWxlbWVudE1ldGFkYXRhKSA8LSBzdHJfcmVwbGFjZShjb2xuYW1lcyh0cmFuc2NyaXB0cy5nckBlbGVtZW50TWV0YWRhdGEpLCAiZ2VuZV9uYW1lIiwgIm5hbWUiKQoKZ2VuZXMuZ3IgPC0gdW5saXN0KHJhbmdlKHNwbGl0KHRyYW5zY3JpcHRzLmdyLCB+IG5hbWUpKSkgICMjIEZyb20gdHJhbnNjcmlwdHMgdG8gZ2VuZXMKZ2VuZXMuZ3IkbmFtZSA8LSBuYW1lcyhnZW5lcy5ncikKCmlmIChHZW5vbWVJbmZvRGI6OnNlcWxldmVsc1N0eWxlKGdlbmVzLmdyKSAhPSBHZW5vbWVJbmZvRGI6OnNlcWxldmVsc1N0eWxlKHguc3BAZmVhdHVyZSkgKSB7CiAgR2Vub21lSW5mb0RiOjpzZXFsZXZlbHNTdHlsZShnZW5lcy5ncikgPC0gR2Vub21lSW5mb0RiOjpzZXFsZXZlbHNTdHlsZSh4LnNwQGZlYXR1cmUpCn0KCnguc3AgPSBjcmVhdGVHbWF0RnJvbU1hdCgKICAgIG9iaj14LnNwLCAKICAgIGlucHV0Lm1hdD0iYm1hdCIsCiAgICBnZW5lcz1nZW5lcy5nciwKICAgIGRvLnBhcj1UUlVFLAogICAgbnVtLmNvcmVzPTEwCiAgKQoKc2F2ZVJEUyh4LnNwLCBmaWxlID0gIn4vbXlfZGF0YS9jZWxscmFuZ2VyLWF0YWMxMTBfY291bnRfMzA0MzlfV1NTUzgwMzgzNjBfR1JDaDM4LTFfMV8wLnNuYXBBVEFDLlJEUyIpCnguc3AgPC0gcmVhZFJEUyggIn4vbXlfZGF0YS9jZWxscmFuZ2VyLWF0YWMxMTBfY291bnRfMzA0MzlfV1NTUzgwMzgzNjBfR1JDaDM4LTFfMV8wLnNuYXBBVEFDLlJEUyIpCmBgYAoKUmVwZWF0IHZpc3VhbGl6YXRpb24gb24gZ21hdApgYGB7cn0KIyMgTWFrZSBzdWVyYXQgb2JqZWN0CmY3NC5zZXUgPC0gc25hcFRvU2V1cmF0KAogICAgb2JqPXguc3AsIAogICAgZWlncy5kaW1zPTE6MjAsIAogICAgbm9ybT1UUlVFLAogICAgc2NhbGU9VFJVRQogICAgKQoKIyMgU2F2ZSBVTUFQIGJhc2VkIG9uIFNuYXBBVEFDIHByb2Nlc3NpbmcKZjc0LnNldSA8LSBSdW5VTUFQKGY3NC5zZXUsIHJlZHVjdGlvbiA9ICJTbmFwQVRBQyIsIGRpbXM9c2lnbmlmLmRpbXMsIHJlZHVjdGlvbi5uYW1lID0gInVtYXAuc25hcCIpCgoKZjc0LnNldSA8LSBGaW5kVmFyaWFibGVGZWF0dXJlcyhmNzQuc2V1KQpmNzQuc2V1IDwtIFJ1blBDQShmNzQuc2V1LCBkaW1zPTE6NTApCmY3NC5zZXUgPC0gUnVuVU1BUChmNzQuc2V1LCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcz0xOjUwLCB2ZXJib3NlPUZBTFNFKSAKClNldXJhdDo6SWRlbnRzKGY3NC5zZXUpIDwtIHguc3BAY2x1c3RlcgoKZ2dwdWJyOjpnZ2FycmFuZ2UoCiAgRGltUGxvdChmNzQuc2V1LCByZWR1Y3Rpb24gPSAidW1hcCIpICsgZ2d0aXRsZSgiZ21hdCIpLAogIERpbVBsb3QoZjc0LnNldSwgcmVkdWN0aW9uID0gInVtYXAuc25hcCIpICsgZ2d0aXRsZSgiYm1hdCAtIHNuYXAiKSAKICApCgpgYGAKCgpgYGB7cn0KcGxvdGx5OjpnZ3Bsb3RseShEaW1QbG90KGY3NC5zZXUsIHJlZHVjdGlvbiA9ICJ1bWFwIiwgZ3JvdXAuYnkgPSBOVUxMKSArIGdndGl0bGUoImdtYXQiKSkKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD0xNSwgZmlnLndpZHRoPTE1fQpGZWF0dXJlUGxvdChmNzQuc2V1LCBmZWF0dXJlcyA9IGMoJ1BUUFJDJywnQ0Q0JywnQ0Q4QScsJ0NEOEInLCdDRDc5QScsJ0ZPWE4xJywnRVBDQU0nLCdQREdGUkEnLCdHTkc0JywgJ0ZPWFAzJywnUkFHMScsJ1JBRzInLCdOS0c3JywnQ0NSNycpLCByZWR1Y3Rpb24gPSAidW1hcC5zbmFwIikKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD0xNSwgZmlnLndpZHRoPTE1fQpEaW1IZWF0bWFwKGY3NC5zZXUsIGRpbXMgPSAxOjYsIGJhbGFuY2VkID0gVFJVRSxuY29sID0gMSkKYGBgCgojIyMgRGlmZmVyZW50aWFsIGFuYWx5c2lzIAo8IS0tIFNuYXAgQVRBQyB3YXkgLS0+CjwhLS0gYGBge3J9IC0tPgo8IS0tIGNsdXN0ZXIgPSAxIC0tPgo8IS0tIERBUnM9IGZpbmREQVIoIC0tPgo8IS0tICAgICBvYmo9eC5zcCwgLS0+CjwhLS0gICAgIGlucHV0Lm1hdD0iZ21hdCIsIC0tPgo8IS0tICAgICBjbHVzdGVyLnBvcz1jbHVzdGVyLCAtLT4KPCEtLSAgICAgIyBjbHVzdGVyLm5lZyA9IDUsIC0tPgo8IS0tICAgICBjbHVzdGVyLm5lZy5tZXRob2Q9InJhbmRvbSIsIC0tPgo8IS0tICAgICB0ZXN0Lm1ldGhvZD0iZXhhY3RUZXN0IiwgLS0+CjwhLS0gICAgIGJjdj0wLjQsICMwLjQgZm9yIGh1bWFuLCAwLjEgZm9yIG1vdXNlIC0tPgo8IS0tICAgICBzZWVkLnVzZT00MiAtLT4KPCEtLSAgICk7IC0tPgoKCjwhLS0gZ21hdC5jbCA8LSB4LnNwQGdtYXRbd2hpY2goeC5zcEBjbHVzdGVyPT1jbHVzdGVyKSxdIC0tPgo8IS0tIGdtYXQubmVnIDwtIHguc3BAZ21hdFt3aGljaCh4LnNwQGNsdXN0ZXIhPWNsdXN0ZXIpLF0gLS0+Cgo8IS0tIGhpc3QoYXMubWF0cml4KGdtYXQuY2wpLCBicmVha3M9NTApIC0tPgoKCjwhLS0gIyBEQVJzICU+JSAtLT4KPCEtLSAgICMgbXV0YXRlKGdlbmU9Y29sbmFtZXMoeC5zcEBnbWF0KSkgJT4lIC0tPgo8IS0tICAgIyBhcnJhbmdlKCkgJT4lIC0tPgo8IS0tICAgIyBmaWx0ZXIoUFZhbHVlIDwgMC4wNSkgLS0+Cgo8IS0tIGhpc3QoREFScyRQVmFsdWUsIGJyZWFrcyA9IDIwKSAtLT4KCjwhLS0gREFScyRGRFIgPSBwLmFkanVzdChEQVJzJFBWYWx1ZSwgbWV0aG9kPSJCSCIpIC0tPgo8IS0tIGlkeSA9IHdoaWNoKERBUnMkRkRSIDwgNWUtMiAmIERBUnMkbG9nRkMgPiAwKSAtLT4KPCEtLSBwbG90KERBUnMkbG9nQ1BNLCBEQVJzJGxvZ0ZDLCAgLS0+CjwhLS0gICAgIHBjaD0xOSwgY2V4PTAuMSwgY29sPSJncmV5IiwgIC0tPgo8IS0tICAgICB5bGFiPSJsb2dGQyIsIHhsYWI9ImxvZ0NQTSIsIC0tPgo8IS0tICAgICBtYWluPXBhc3RlKCJDbHVzdGVyIiwgY2x1c3RlcikgLS0+CjwhLS0gICApIC0tPgo8IS0tIHBvaW50cyhEQVJzJGxvZ0NQTVtpZHldLCAgLS0+CjwhLS0gICAgIERBUnMkbG9nRkNbaWR5XSwgIC0tPgo8IS0tICAgICBwY2g9MTksICAtLT4KPCEtLSAgICAgY2V4PTAuNSwgIC0tPgo8IS0tICAgICBjb2w9InJlZCIgLS0+CjwhLS0gICApIC0tPgoKPCEtLSBgYGAgLS0+CmBgYHtyfQpEQUdzX2NsIDwtIEZpbmRBbGxNYXJrZXJzKGY3NC5zZXUsIG1pbi5wY3QgPSAwLjIsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMykKREFHc19jbCA8LSAKICBEQUdzX2NsICU+JQogIG11dGF0ZShwb3NpdGl2ZT1hdmdfbG9nRkMgPiAwKQpgYGAKYGBge3IsIGZpZy5oZWlnaHQ9MTQsIGZpZy53aWR0aD05fQp0b3AxMF9tYXJrZXJzIDwtIERBR3NfY2wgJT4lCiAgZmlsdGVyKHBvc2l0aXZlKSAlPiUKICBncm91cF9ieShjbHVzdGVyKSAlPiUKICBhcnJhbmdlKHBfdmFsX2FkaikgJT4lCiAgdG9wX24oMTApICU+JQogIHB1bGwoZ2VuZSkgJT4lCiAgdW5pcXVlKCkKCnRvcDEwX21hcmtlcnMgPC0gREFHc19jbCAlPiUKICBmaWx0ZXIocG9zaXRpdmUpICU+JQogIGdyb3VwX2J5KGNsdXN0ZXIpICU+JQogICMgYXJyYW5nZShwX3ZhbF9hZGopICU+JQogIHRvcF9uKDEwLHd0ID0gLSBwX3ZhbF9hZGopICU+JQogIHB1bGwoZ2VuZSkKCkRvdFBsb3QoZjc0LnNldSwgZmVhdHVyZXMgPSB0b3AxMF9tYXJrZXJzKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKRXhwcmVzc2lvbiBvZiBtYXJrZXJzIGluIFJOQSBkYXRhCgpgYGB7ciwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTE2fQpwbG90X21hcmtlcl9BVEFDdnNSTkEgPC0gZnVuY3Rpb24obWFya2VyKXsKICAgIGdncHVicjo6Z2dhcnJhbmdlKAogICAgICBGZWF0dXJlUGxvdChmNzQuc2V1LCBmZWF0dXJlPW1hcmtlciwgcmVkdWN0aW9uPSJ1bWFwLnNuYXAiKSArIGdndGl0bGUoIkFUQUMiKSwgRmVhdHVyZVBsb3QoZjc0LnJuYS5zZXUsIGZlYXR1cmU9bWFya2VyKSArIGdndGl0bGUoIlJOQSIpCiAgICApICU+JSBhbm5vdGF0ZV9maWd1cmUodG9wPW1hcmtlcikKICB9CgpwbG90X2NsdXN0ZXJfbWFya2VyX0FUQUN2c1JOQSA8LSBmdW5jdGlvbihjbCl7CiAgdG9wMTBfY2x1c3RlciA8LQogICAgREFHc19jbCAlPiUKICAgIGZpbHRlcihwb3NpdGl2ZSkgJT4lCiAgICBmaWx0ZXIoY2x1c3Rlcj09Y2wpICU+JQogICAgZmlsdGVyKGdlbmUgJWluJSByb3duYW1lcyhmNzQucm5hLnNldSkpICU+JQogICAgdG9wX24oMTAsd3QgPSAtIHBfdmFsX2FkaikgJT4lCiAgICBwdWxsKGdlbmUpCiAgZ2dhcnJhbmdlKHBsb3RsaXN0ID0gbWFwKHRvcDEwX2NsdXN0ZXIsIH4gcGxvdF9tYXJrZXJfQVRBQ3ZzUk5BKC54KSksIG5jb2w9MiwgbnJvdz01KSAlPiUgCiAgICBhbm5vdGF0ZV9maWd1cmUoZmlnLmxhYj1wYXN0ZSgiQ2x1c3RlciIsIGNsKSwgZmlnLmxhYi5zaXplID0gMjAsIGZpZy5sYWIuZmFjZSA9ICJib2xkIikKICB9CgptYXAoMToxMCwgfiBwbG90X2NsdXN0ZXJfbWFya2VyX0FUQUN2c1JOQSgueCkpCmBgYAoKIyMgRGlmZmVyZW50aWFsIGFuYWx5c2lzIG9ubHkgYmV0d2VlbiB0aGUgcHV0YXRpdmUgVC1jZWxsIGNsdXN0ZXJzCmBgYHtyLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0xNX0KdF9jbHVzdGVycyA8LSBjKCIxIiwgJzInLCAnMycsICc0JywgJzUnKQpEQUdzX3RjZWxscyA8LSBtYXAodF9jbHVzdGVycywgfiBGaW5kTWFya2VycyhmNzQuc2V1LCBpZGVudC4xID0gLngsIGlkZW50LjIgPSBzZXRkaWZmKHRfY2x1c3RlcnMsLngpLCBtaW4ucGN0ID0gMC4yLCBsb2dmYy50aHJlc2hvbGQgPSAwLjMpKQoKdG9wMjBfdGNlbGxzX21hcmtlcnMgPC0gaW1hcChEQUdzX3RjZWxscywgfiAueCAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCkgJT4lIGZpbHRlciggYXZnX2xvZ0ZDID4gMCkgJT4lIG11dGF0ZShjbHVzdGVyPS55KSkgJT4lCiAgcHVycnI6OnJlZHVjZShiaW5kX3Jvd3MpICU+JQogICMgZmlsdGVyKHBvc2l0aXZlKSAlPiUKICBncm91cF9ieShjbHVzdGVyKSAlPiUKICB0b3BfbigyMCx3dCA9IC0gcF92YWxfYWRqKSAlPiUKICBwdWxsKHJvd25hbWUpCgoKRG90UGxvdChmNzQuc2V1LCBmZWF0dXJlcyA9IHRvcDIwX3RjZWxsc19tYXJrZXJzKSArCiAgY29vcmRfZmxpcCgpICsKICBnZ3RpdGxlKCJULWNlbGwgc3VidHlwZXMgbWFya2VycyAoREEgYmV0d2VlbiBjbHVzdGVycyAxLTUpIikKYGBgCgpPbmx5IGJldHdlZW4gY2x1c3RlciAxIGFuZCAyCmBgYHtyfQpEQUdzX3RjZWxsc18xMiA8LSBGaW5kTWFya2VycyhmNzQuc2V1LCBpZGVudC4xID0gJzEnLCBpZGVudC4yID0gJzInLCBtaW4ucGN0ID0gMC4yLCBsb2dmYy50aHJlc2hvbGQgPSAwLjMpCgp0b3AyMF9jbDEyX21hcmtlcnMgPC0gREFHc190Y2VsbHNfMTIgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigpICU+JSAKICBmaWx0ZXIoIGF2Z19sb2dGQyA+IDApICU+JSAKICB0b3BfbigyMCx3dCA9IC0gcF92YWxfYWRqKSAlPiUKICBwdWxsKHJvd25hbWUpCgpEb3RQbG90KGY3NC5zZXUsIGZlYXR1cmVzID0gdG9wMjBfY2wxMl9tYXJrZXJzKSArCiAgY29vcmRfZmxpcCgpICsKICBnZ3RpdGxlKCJEQSBiZXR3ZWVuIGNsdXN0ZXJzIDEtMiIpCmBgYAoKCgpgYGB7cn0KcGxvdGx5OjpnZ3Bsb3RseShEaW1QbG90KGY3NC5ybmEuc2V1LCBncm91cC5ieSA9ICJhbm5vdGF0aW9uIikpCmBgYAoKCiMjIEVtYmVkZGluZyBvbiBtb3N0IHZhcmlhYmxlIGdlbmVzIGluIEFUQUMgKG5vdCBpbiBnZW5lIGV4cHJlc3Npb24pCmBgYHtyfQpEZWZhdWx0QXNzYXkoZjc0LnNldSkgPC0gIkFDVElWSVRZIgpmNzQuc2V1Lmh2Z2F0YWMgPC0gRmluZFZhcmlhYmxlRmVhdHVyZXMoZjc0LnNldSkKZjc0LnNldS5odmdhdGFjIDwtIFJ1blBDQShmNzQuc2V1Lmh2Z2F0YWMsIGRpbXM9MTozMCkKZjc0LnNldS5odmdhdGFjIDwtIFJ1blVNQVAoZjc0LnNldS5odmdhdGFjLCByZWR1Y3Rpb24gPSAicGNhIiwgZGltcz0xOjMwLCB2ZXJib3NlPUZBTFNFKSAKCmY3NC5zZXUuaHZnYXRhYyA8LSBBZGRNZXRhRGF0YShmNzQuc2V1Lmh2Z2F0YWMsIHguc3BAY2x1c3RlciwgY29sLm5hbWU9J1NuYXBBVEFDX2NsdXN0ZXInKQpEaW1QbG90KGY3NC5zZXUuaHZnYXRhYywgcmVkdWN0aW9uID0gInVtYXAiLCBncm91cC5ieSA9ICJTbmFwQVRBQ19jbHVzdGVyIikgCmBgYAoKIyMgU2F2ZSBtYXJrZXJzCmBgYHtyfQpEQUdzX2NsICU+JSBmaWx0ZXIocG9zaXRpdmUpICU+JSB3cml0ZV9jc3YoIn4vbXlfZGF0YS9pbnRlZ3JhdGVkX3RoeW11cy9GNzRfQVRBQ19jbHVzdGVyTWFya2Vyc19hbGxWU2FsbF8yMDE5MTEwNC5jc3YiKQppbWFwKERBR3NfdGNlbGxzLCB+IC54ICU+JSAKICByb3duYW1lc190b19jb2x1bW4oImdlbmUiKSAlPiUKICBmaWx0ZXIoYXZnX2xvZ0ZDID4gMCkgJT4lCiAgbXV0YXRlKGNsdXN0ZXI9LnkpKSAlPiUKICBwdXJycjo6cmVkdWNlKGJpbmRfcm93cykgJT4lCiAgd3JpdGVfY3N2KCJ+L215X2RhdGEvaW50ZWdyYXRlZF90aHltdXMvRjc0X0FUQUNfY2x1c3Rlck1hcmtlcnNfMXRvNVZTMXRvNV8yMDE5MTEwNC5jc3YiKQoKREFHc190Y2VsbHNfMTIgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigiZ2VuZSIpICU+JQogIHdyaXRlX2Nzdigifi9teV9kYXRhL2ludGVncmF0ZWRfdGh5bXVzL0Y3NF9BVEFDX2NsdXN0ZXJNYXJrZXJzXzFWUzJfMjAxOTExMDQuY3N2IikKYGBgCgoKCiMjIFRob3VnaHRzCgotIFRoZXJlIHNlZW1zIHRvIGJlIGEgY29ycmVzcG9uZGFuY2UgZm9yIGdlbmUgZXhwcmVzc2lvbiBhbmQgYWNjZXNzaWJpbGl0eSBpbiBtYW55ICJhY2Nlc3NpYmlsaXR5IG1hcmtlcnMiIChzZWUgQ2x1c3RlciA2KSAtLT4gbWF5YmUgaW50ZWdyYXRpb24gd291bGQgd29yayBiZXR0ZXIgaWYgSSBkb24ndCB0YWtlIG9ubHkgdGhlIG1vc3QgdmFyaWFibGUgZmVhdHVyZXMgaW4gdGhlIFJOQSBkYXRhLiAKCgoK